﻿using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Web.Mvc;
using Comissoes.Content.NFe.Relatorios;
using Comissoes.JQGridObject;
using Comissoes.Models;
using Comissoes.Utilities;

namespace Comissoes.Controllers
{
    public class NotasFiscaisController : AppController
    {
        xcontEntities db = new Models.xcontEntities();

        public ActionResult Index()
        {
            return View(new NotasFiscaisModel(null));
        }
        
        public ActionResult Digitacao(Int32? id)
        {
            return View(new NotasFiscaisModel(id));
        }

        public ActionResult Cabecalho()
        {
            return PartialView(new NotasFiscaisModel(null));
        }

        public ActionResult Complemento()
        {
            return PartialView(new NotasFiscaisModel(null));
        }

        public ActionResult Itens()
        {
            return PartialView(new NotasFiscaisModel(null));
        }

        public ActionResult Totais()
        {
            return PartialView(new NotasFiscaisModel(null));
        }

        public FileStreamResult Danfe()
        {
            List<string> erros = new List<string>();

            DataSet data = new DataSet();
            data.ReadXml(Server.MapPath("~/Content/NFe/Gravadas/4306039266561101315555099000006992000705547-nfe.xml"));

            DanfeAtualizado danfe = new DanfeAtualizado();
            danfe.Load(Server.MapPath("DanfeAtualizado.rpt"));

            danfe.SetDataSource(data);

            Stream stream = danfe.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);

            return File(stream, "application/pdf", "4306039266561101315555099000006992000705547-nfe.pdf");
        }

        [HttpPost]
        public ActionResult Update(FormCollection form)
        {
            NotasFiscaisModel nf = new NotasFiscaisModel(Convertions.Inteiro(form["ID_NF"]));

            nf.Validate(form);

            if (nf.SemErros())
            {
                nf.Update(form);
            }

            return Json(new { result = nf.SemErros(), erros = nf.erros, ID_NF = nf.nf.ID_NF }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult NotasFiscaisList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchString, String searchOper, String status)
        {
            try
            {
                var q = from c in db.NOTAS_FISCAIS
                        where c.STATUS_NF == status
                        select new
                        {
                            c.ID_NF,
                            c.NUMERO_NF,
                            c.EMISSAO_NF,
                            TIPOOP_NF = c.TIPOOP_NF == "1" ? "Saída" : "Entrada",
                            c.SAIENT_NF,
                            c.VENDAS.VLRTOT_VDA,
                            ITENS = c.VENDAS.ITENS_VENDA.Count(),
                            c.CHAVENFE_NF
                        };

                Dictionary<string, string> formats = new Dictionary<string, string>
                {
                    { "EMISSAO_NF", "B" },
                    { "SAIENT_NF", "B" },
                    { "VLRTOT_VDA", "A" }
                };

                JQGridBuilder jbuilder = new JQGridBuilder(q, page, sidx, sord, searchField, searchString, searchOper, "ID_NF", _search, rows, formats);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public JsonResult ItensList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchString, String searchOper, Int32? ID_NF)
        {
            try
            {
                var q = from c in db.NOTAS_FISCAIS.Include("VENDAS").ToList()
                        join d in db.ITENS_VENDA.Include("VENDAS")
                                                .Include("VENDAS.LOJAS")
                                                .Include("PRODUTOS_LISTA")
                                                .Include("PRODUTOS_LISTA.PRODUTOS")
                                                .Include("PRODUTOS_LISTA.PRODUTOS.NCM")
                                                .Include("NATUREZAS_OPERACAO")
                                                .Include("PRODUTOS_LISTA.PRODUTOS.UNIDADES").ToList() on c.VENDAS.ID_VDA equals d.VENDAS.ID_VDA
                        where c.ID_NF == ID_NF
                        select new
                        {
                            act = "",
                            d.ID_ITVD,
                            d.ITEM_ITVD,
                            COD_LOJA = d.VENDAS.LOJAS.COD_LOJA + " - " + d.VENDAS.LOJAS.NOME_LOJA,
                            d.PRODUTOS_LISTA.PRODUTOS.COD_PROD,
                            d.PRODUTOS_LISTA.PRODUTOS.DESC_PROD,
                            CARAC_PROD = "",
                            COD_NCM = d.PRODUTOS_LISTA.PRODUTOS.NCM.COD_NCM + " - " + d.PRODUTOS_LISTA.PRODUTOS.NCM.DESC_NCM,
                            CFOP_NTOP = d.NATUREZAS_OPERACAO.CFOP_NTOP + " - " + d.NATUREZAS_OPERACAO.DESC_NTOP,
                            d.PRODUTOS_LISTA.PRODUTOS.UNIDADES.COD_UNID,
                            d.QTDE_ITVD,
                            d.PRODUTOS_LISTA.PRECO_PDLS,
                            d.VLRTOT_ITVD,
                            BICMS_ITVD = (d.BICMS_ITVD ?? 0) + (d.BICMSST_ITVD ?? 0),
                            PICMS_ITVD = (d.PICMS_ITVD ?? 0) + (d.PICMSST_ITVD ?? 0)
                                         /
                                         (d.PICMS_ITVD.HasValue && d.PICMS_ITVD.HasValue ? 2 : 1),
                            ICMS_ITVD = (d.ICMS_ITVD ?? 0) + (d.ICMSST_ITVD ?? 0),
                            d.IPI_ITVD
                        };

                Dictionary<string, string> formats = new Dictionary<string, string>
                {
                    { "PRECO_PDLS", "A" },
                    { "VLRTOT_ITVD", "A" },
                    { "BICMS_ITVD", "A" },
                    { "ICMS_ITVD", "A" },
                    { "IPI_ITVD", "A" }
                };

                JQGridBuilder jbuilder = new JQGridBuilder(q.AsQueryable(), page, sidx, sord, searchField, searchString, searchOper, "ID_ITVD", _search, rows, formats);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public JsonResult ItenDetails(Int32 ID_ITVD)
        {
            NotasFiscaisModel nf = new NotasFiscaisModel();

            return Json(nf.ItenDetails(ID_ITVD), JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        public JsonResult UpdateItenVenda(FormCollection form)
        {
            NotasFiscaisModel nf = new NotasFiscaisModel(Convertions.Inteiro(form["ID_NF"]));

            return Json(new { result = nf.SemErros(), erros = nf.erros, ID_NF = nf.nf.ID_NF }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult RemoveEndereco(Char type, Int32? ID_ENPS)
        {
            NotasFiscaisModel nf = new NotasFiscaisModel(Convertions.Inteiro(Request["ID_NF"]));
            
            return Json(new { result = nf.SemErros(), erros = nf.erros }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult GerarNumeroSerieNF(Int32 COD_LOJA, Int32? ID_NF)
        {
            NotasFiscaisModel nf = new NotasFiscaisModel(ID_NF);
            nf.GerarNumeroSerieNF(COD_LOJA);

            return Json(new { result = nf.SemErros(), erros = nf.erros }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult Transmitir(Int32 ID_NF)
        {
            NFeModel nfe = new NFeModel();
            
            nfe.Transmitir(new NotasFiscaisModel(ID_NF).nf);

            return Json(new { result = nfe.SemErros(), erros = nfe.erros }, JsonRequestBehavior.AllowGet);
        }
        
        [HttpPost]
        public JsonResult Cancelar(FormCollection form)
        {
            NFeModel nfe = new NFeModel();
            nfe.Cancelar(form);

            return Json(new { result = nfe.SemErros(), erros = nfe.erros }, JsonRequestBehavior.AllowGet);
        }

        public ActionResult Inutilizar()
        {
            return View(new NotasFiscaisModel());
        }

        [HttpPost]
        public JsonResult Inutilizar(FormCollection form)
        {
            NFeModel nfe = new NFeModel();

            nfe.Inutilizar(form);

            return Json(new { result = nfe.SemErros(), erros = nfe.erros }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult EnderecosCount(Int32? ID_PESSOA, Char? tipo)
        {
            PESSOAS pessoa;

            switch (tipo)
            {
                case 'A':
                    pessoa = db.LOJAS.Include("PESSOAS").FirstOrDefault(t => t.COD_LOJA == ID_PESSOA).PESSOAS;
                    break;
                case 'B':
                    pessoa = db.CLIENTES.Include("PESSOAS").FirstOrDefault(t => t.COD_CLI == ID_PESSOA).PESSOAS;
                    break;
                default:
                    pessoa = db.TRANSPORTADORES.Include("PESSOAS").FirstOrDefault(t => t.COD_TRAN == ID_PESSOA).PESSOAS;
                    break;
            }

            var es = db.ENDERECOS_PESSOA.Where(t => t.PESSOAS.ID_PESSOA == pessoa.ID_PESSOA);

            return Json(new
            {
                enderecos =  es.Count(),
                ID_ENPS = es.Any() ? es.First().ID_ENPS : 0
            }, JsonRequestBehavior.AllowGet);
        }

        public JsonResult VolumesList(String sidx, String sord, Int32 page, Int32 rows, Boolean _search, String searchField, String searchString, String searchOper, Int32? ID_NF)
        {
            try
            {
                var q = from c in db.VOLUMES_NF
                        where c.NOTAS_FISCAIS.ID_NF == ID_NF
                        select new
                        {
                            act = "",
                            c.VOLUMES.ID_VOL,
                            c.VOLUMES.ESPECIE_VOL,
                            c.VOLUMES.MARCA_VOL,
                            c.VOLUMES.NUMERACAO_VOL,
                            c.VOLUMES.QTDE_VOL,
                            c.VOLUMES.PESOBRT_VOL,
                            c.VOLUMES.PESOLIQ_VOL
                        };

                JQGridBuilder jbuilder = new JQGridBuilder(q.AsQueryable(), page, sidx, sord, searchField, searchString, searchOper, "ID_VOL", _search, rows);

                return Json(jbuilder.GetObject(), JsonRequestBehavior.AllowGet);
            }
            catch
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }
        }

        public JsonResult EnviarArquivoPorEmail(Int32 ID_NF)
        {
            NOTAS_FISCAIS nf = db.NOTAS_FISCAIS.First(t => t.ID_NF == ID_NF);

            return Json(new { }, JsonRequestBehavior.AllowGet);
        }

        public FileResult SalvarArquivoLocalmente(Int32 id)
        {
            NFeModel nfe = new NFeModel();

            NOTAS_FISCAIS nf = db.NOTAS_FISCAIS.First(t => t.ID_NF == id);

            String arquivo = nfe.LocalizarArquivoPorTipo('L',nf.CHAVENFE_NF);

            return File(arquivo, "text/xml");
        }
    }
}